// msi/MSI1010.js
// MSI-1010 条码编码器（Modified Plessey + 双重 Mod 10 校验）
// 先对原始数据加一个 Mod 10 校验位，再对“原始数据 + 第一个校验位”加第二个 Mod 10

import MSI from './MSI.js';
import { mod10 } from './checksums.js';

/**
 * MSI-1010 条码类（双重 Mod 10 校验）
 *
 * 编码规则：
 * 1. 第一个校验位 = mod10(原始数据)
 * 2. 第二个校验位 = mod10(原始数据 + 第一个校验位)
 * 3. 最终编码数据 = 原始数据 + 第一个校验位 + 第二个校验位
 *
 * 示例：
 *   输入: '12345'
 *   第一次 Mod 10: mod10('12345') = 4
 *   第二次 Mod 10: mod10('123454') = 0
 *   实际编码数据: '1234540'
 */
class MSI1010 extends MSI {
  /**
   * 构造函数
   * @param {string} data - 原始数字字符串（不含校验位）
   * @param {Object} options - 条码配置项
   */
  constructor(data, options) {
    if (!/^[0-9]+$/.test(data)) {
      throw new Error('MSI1010: 输入必须为纯数字');
    }

    const firstChecksum = mod10(data);
    const secondChecksum = mod10(data + firstChecksum);

    const encodedData = data + firstChecksum + secondChecksum;

    super(encodedData, options);

    // 保留关键信息，便于调试或验证
    this.originalData = data;
    this.firstChecksum = firstChecksum;
    this.secondChecksum = secondChecksum;
  }

  /**
   * 验证原始输入是否为纯数字
   * @returns {boolean}
   */
  valid() {
    return /^[0-9]+$/.test(this.originalData);
  }

  /**
   * 获取第一个 Mod 10 校验位
   * @returns {number} 0–9
   */
  getFirstChecksum() {
    return this.firstChecksum;
  }

  /**
   * 获取第二个 Mod 10 校验位
   * @returns {number} 0–9
   */
  getSecondChecksum() {
    return this.secondChecksum;
  }

  /**
   * 获取完整校验字符串（两位）
   * @returns {string}
   */
  getChecksumString() {
    return `${this.firstChecksum}${this.secondChecksum}`;
  }
}

export default MSI1010;